﻿using System.Web.Mvc;
using zeus.Core;
using SharpArch.Web.NHibernate;
using SharpArch.Core;
using SharpArch.Core.PersistenceSupport;
using System.Collections.Generic;
using Webdiyer.WebControls.Mvc;
using zeus.Core.RepositoryInterfaces;
using zeus.Web.Controllers.Helpers;
using System.Linq;
using System;



namespace zeus.Web.Controllers
{
    [HandleError]
    public class ComandosController : Controller
    {

        private readonly IUnidadRepository unidadRepository;
        private readonly IRepository<Comando> comandoRepository;
        private readonly IUbicacionRepository ubicacionRepository;
        private readonly IRepository<Cliente> clienteRepository;
        private readonly IUsuarioRepository usuarioRepository;

        public ComandosController(IUbicacionRepository ubicacionRepository,
             IUnidadRepository unidadRepository, IRepository<Comando> comandoRepository, IRepository<Cliente> clienteRepository, IUsuarioRepository usuarioRepository)
        {
            Check.Require(ubicacionRepository != null, "ubicacionRepository may not be null");
            this.ubicacionRepository = ubicacionRepository;

            Check.Require(unidadRepository != null, "unidadRepository may not be null");
            this.unidadRepository = unidadRepository;

            Check.Require(comandoRepository != null, "eventoRepository may not be null");
            this.comandoRepository = comandoRepository;

            Check.Require(clienteRepository != null, "eventoRepository may not be null");
            this.clienteRepository = clienteRepository;

            Check.Require(usuarioRepository != null, "eventoRepository may not be null");
            this.usuarioRepository = usuarioRepository;
        }

        public WorkingSession workingSession
        {
            get
            {
                if (Session["WorkingSession"] == null)
                    throw new SessionExpiredException();
                return Session["WorkingSession"] as WorkingSession;
            }
            set
            {
                Session["WorkingSession"] = value;
            }
        }

        public ActionResult EnvioComandos(int? id, int? clienteId, int? und)
        {

            try
            {

                //if (!usuarioRepository.IsInRole(User.Identity.Name, "admin"))
                //    return RedirectToAction("NoAutorizado", "Shared");
                
                IList<Cliente> clientes = clienteRepository.GetAll();
                ViewData["Clientes"] = new SelectList(clientes, "Id", "Nombre", clienteId);

                IList<Unidad> unidades = new List<Unidad>();

                if (usuarioRepository.IsInRole(User.Identity.Name, "admin"))
                {
                    unidades = unidadRepository.GetByCliente(clienteId ?? clientes[0].Id);
                    ViewData["IsAdmin"] = true;
                }
                else
                {
                    unidades = unidadRepository.GetByUsuario(workingSession.Usuario.Id);
                    ViewData["IsAdmin"] = false;
                }

                Check.Require(unidades.Count > 0, "No existen unidades asignadas");

                Dictionary<string, object> filtro = new Dictionary<string, object>();

                List<int> unidadesID = new List<int>();

                // Validar que exista la Unidad
                if (und != null && (bool)ViewData["IsAdmin"] == false)
                {
                    unidades.ToList().ForEach(p => unidadesID.Add(p.Id));
                    Check.Require(unidadesID.Contains(und.Value), "No se puede proceder con el ID indicado");
                }

                ViewData["CodigoUnidad"] = new SelectList(unidades, "Id", "Nombre", und ?? 0);


                //IList<Ubicacion> ubic = ubicacionRepository.GetUbicaciones(und ?? unidades[0].Id);
                //PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 10);
                //return View(ubicaciones);

                //IList<Unidad> unidades = unidadRepository.GetAll();
               // ViewData["CodigoUnidad"] = new SelectList(unidades, "Id", "Nombre");
                return View();
            }
            catch (PreconditionException ex)
            {
                TempData["ErrorMessage"] = ex.Message;
                return RedirectToAction("Error", "Shared");
            }
            catch (SessionExpiredException)
            {
                TempData["ErrorMessage"] = "Sesión Expirada!";
                TempData["Expire"] = true;
                return RedirectToAction("Error", "Shared");
            }
            catch (Exception ex)
            {
                TempData["ErrorMessage"] = ex.Message;
                return RedirectToAction("Error", "Shared");
            }

            /////////////////////////////
            

        }


        [Transaction, HttpPost, Authorize]
        public ActionResult posicion(int id)
        {
            Comando comand = new Comando();
            //comand.Id = 1;
            comand.CodigoUnidad = id;
            comand.CodigoEvento = 9;
            comandoRepository.SaveOrUpdate(comand);

            int unidad;

            unidad = unidadRepository.GetNumeroUnidad(id);



            return Json(unidad);




        }



        [Transaction, HttpPost, Authorize]
        public ActionResult sirena_on(int id)
        {
            Comando comand = new Comando();
            //comand.Id = 1;
            comand.CodigoUnidad = id;
            comand.CodigoEvento = 9;
            comandoRepository.SaveOrUpdate(comand);

            int unidad;

            unidad=unidadRepository.GetNumeroUnidad(id);

            
            
            return Json(unidad);

            


        }

        [Transaction, HttpPost, Authorize]
        public ActionResult sirena_off(int id)
        {
            Comando comand = new Comando();
            //comand.Id = 1;
            comand.CodigoUnidad = id;
            comand.CodigoEvento = 10;
            comandoRepository.SaveOrUpdate(comand);

            int unidad;

            unidad = unidadRepository.GetNumeroUnidad(id);



            return Json(unidad);


        }


        [Transaction, HttpPost, Authorize]
        public ActionResult cerrar_puerta(int id)
        {
            Comando comand = new Comando();
            //comand.Id = 1;
            comand.CodigoUnidad = id;
            comand.CodigoEvento = 10;
            comandoRepository.SaveOrUpdate(comand);

            int unidad;

            unidad = unidadRepository.GetNumeroUnidad(id);



            return Json(unidad);


        }



        [Transaction, HttpPost, Authorize]
        public ActionResult abrir_puerta(int id)
        {
            Comando comand = new Comando();
            //comand.Id = 1;
            comand.CodigoUnidad = id;
            comand.CodigoEvento = 10;
            comandoRepository.SaveOrUpdate(comand);

            int unidad;

            unidad = unidadRepository.GetNumeroUnidad(id);



            return Json(unidad);


        }

        [Transaction]
        public ActionResult sendCommand(int id, string comando)
        {

            List<object> datos = new List<object> { id };
            //object toda una lista del objeto ubicacion...selecciono los datos q dese y no todo el objeto 


            return View(datos);


        }

    }
}
